"""
AI报告生成API控制器

重构后的API控制器，专注于HTTP请求处理，业务逻辑委托给服务层。
遵循单一职责原则，提供清晰的API接口。
"""

import logging
from typing import Dict, Any
from fastapi import APIRouter, HTTPException
from fastapi.responses import JSONResponse

from .service.report_service import get_report_service, ReportService
from .core.report_generator import ReportResult

logger = logging.getLogger(__name__)

# 创建路由器
ai_report_router = APIRouter(prefix='/test/ai/report', tags=['ai', '报表'])


class ReportController:
    """报告控制器类"""
    
    def __init__(self, report_service: ReportService = None):
        """
        初始化控制器
        
        Args:
            report_service: 报告服务实例，如果为None则使用全局实例
        """
        self.report_service = report_service or get_report_service()
        self.logger = logging.getLogger(self.__class__.__name__)
    
    def validate_request_data(self, data: Dict[str, Any], required_fields: list) -> Dict[str, Any]:
        """
        验证请求数据
        
        Args:
            data: 请求数据
            required_fields: 必需字段列表
            
        Returns:
            Dict[str, Any]: 验证后的数据
            
        Raises:
            HTTPException: 验证失败时抛出
        """
        if not isinstance(data, dict):
            raise HTTPException(status_code=400, detail="请求数据必须是JSON对象")
        
        missing_fields = [field for field in required_fields if field not in data]
        if missing_fields:
            raise HTTPException(
                status_code=400, 
                detail=f"缺少必需字段: {', '.join(missing_fields)}"
            )
        
        return data
    
    def format_success_response(self, result: ReportResult) -> Dict[str, Any]:
        """
        格式化成功响应
        
        Args:
            result: 报告生成结果
            
        Returns:
            Dict[str, Any]: 格式化后的响应
        """
        if result.success and result.url:
            return {
                'status': 1,
                'message': '报告生成成功',
                'url': result.url,
                'metadata': result.metadata
            }
        else:
            return {
                'status': 0,
                'message': result.error_message or '报告生成失败'
            }
    
    def format_error_response(self, error: Exception) -> Dict[str, Any]:
        """
        格式化错误响应
        
        Args:
            error: 异常对象
            
        Returns:
            Dict[str, Any]: 格式化后的错误响应
        """
        error_message = str(error)
        self.logger.error(f"API错误: {error_message}", exc_info=True)
        
        return {
            'status': 0,
            'message': error_message
        }


# 创建控制器实例
controller = ReportController()


@ai_report_router.post("/worker")
async def worker_report(data: dict) -> dict:
    """
    生成工人工作报告
    
    Args:
        data: 请求数据，包含以下字段：
            - projectId: 项目ID
            - startDate: 开始日期
            - endDate: 结束日期
            - imei_list: IMEI列表（可选）
    
    Returns:
        dict: 响应数据
    """
    try:
        # 验证请求数据
        validated_data = controller.validate_request_data(
            data, 
            ['projectId', 'startDate', 'endDate']
        )
        
        # 生成报告
        result = await controller.report_service.generate_worker_report(validated_data)
        
        # 返回格式化响应
        return controller.format_success_response(result)
        
    except HTTPException:
        # 重新抛出HTTP异常
        raise
    except Exception as e:
        # 处理其他异常
        return controller.format_error_response(e)


@ai_report_router.post("/equipment")
async def equipment_statistics(data: dict) -> dict:
    """
    生成设备统计报告
    
    Args:
        data: 请求数据，包含以下字段：
            - memberId: 成员ID
            - startDate: 开始日期
            - endDate: 结束日期
    
    Returns:
        dict: 响应数据
    """
    try:
        # 验证请求数据
        validated_data = controller.validate_request_data(
            data, 
            ['memberId', 'startDate', 'endDate']
        )
        
        # 生成报告
        result = await controller.report_service.generate_equipment_report(validated_data)
        
        # 返回格式化响应
        return controller.format_success_response(result)
        
    except HTTPException:
        raise
    except Exception as e:
        return controller.format_error_response(e)


@ai_report_router.post("/equipment_project")
async def equipment_statistics_project(data: dict) -> dict:
    """
    生成项目设备统计报告
    
    Args:
        data: 请求数据，包含以下字段：
            - projectId: 项目ID
            - startDate: 开始日期
            - endDate: 结束日期
    
    Returns:
        dict: 响应数据
    """
    try:
        # 验证请求数据
        validated_data = controller.validate_request_data(
            data, 
            ['projectId', 'startDate', 'endDate']
        )
        
        # 生成报告
        result = await controller.report_service.generate_project_report(validated_data)
        
        # 返回格式化响应
        return controller.format_success_response(result)
        
    except HTTPException:
        raise
    except Exception as e:
        return controller.format_error_response(e)


@ai_report_router.get("/status")
async def get_service_status() -> dict:
    """
    获取服务状态
    
    Returns:
        dict: 服务状态信息
    """
    try:
        status = controller.report_service.get_service_status()
        return {
            'status': 1,
            'message': '服务正常',
            'data': status
        }
    except Exception as e:
        return controller.format_error_response(e)


@ai_report_router.get("/types")
async def get_supported_report_types() -> dict:
    """
    获取支持的报告类型
    
    Returns:
        dict: 支持的报告类型列表
    """
    try:
        types = controller.report_service.get_supported_report_types()
        return {
            'status': 1,
            'message': '获取成功',
            'data': types
        }
    except Exception as e:
        return controller.format_error_response(e)


# 为了兼容性，保留原有的一些函数（已废弃，但可能被其他地方调用）
# 这些函数将在所有依赖更新后移除

async def get_data_range_from_utc_date_str(data):
    """
    DEPRECATED: 获取数据范围的函数，已移至BaseReportGenerator.get_time_range
    保留此函数仅为兼容性，请使用新的架构
    """
    logger.warning("使用了已废弃的函数get_data_range_from_utc_date_str，请更新代码")
    from .core.report_generator import BaseReportGenerator
    
    # 创建临时实例来调用方法
    temp_generator = type('TempGenerator', (BaseReportGenerator,), {
        'extract_data': lambda self, data: None,
        'transform_data': lambda self, raw_data, request_data: None,
        'analyze_with_ai': lambda self, processed_data, request_data: None,
        'generate_output': lambda self, ai_content, processed_data, request_data: None
    })({})
    
    return temp_generator.get_time_range(data)


def df_to_csv_str(df, **kwargs):
    """
    DEPRECATED: DataFrame转CSV字符串的函数，已移至BaseReportGenerator.df_to_csv_string
    保留此函数仅为兼容性，请使用新的架构
    """
    logger.warning("使用了已废弃的函数df_to_csv_str，请更新代码")
    from .core.report_generator import BaseReportGenerator
    
    # 创建临时实例来调用方法
    temp_generator = type('TempGenerator', (BaseReportGenerator,), {
        'extract_data': lambda self, data: None,
        'transform_data': lambda self, raw_data, request_data: None,
        'analyze_with_ai': lambda self, processed_data, request_data: None,
        'generate_output': lambda self, ai_content, processed_data, request_data: None
    })({})
    
    return temp_generator.df_to_csv_string(df, **kwargs)


def md_to_pdf_and_upload(md_content: str, oss_file_name: str):
    """
    DEPRECATED: Markdown转PDF并上传的函数，已移至FileService.create_and_upload_pdf
    保留此函数仅为兼容性，请使用新的架构
    """
    logger.warning("使用了已废弃的函数md_to_pdf_and_upload，请更新代码")
    # 这是一个同步函数，但新的架构使用异步，所以这里只是返回None
    # 实际使用时应该更新调用方的代码
    return None